package study.myself.exception;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.junit.Test;

/**
* @Name: ExceptionDemo02
* @Description: 编译期异常和运行期异常的区别测试类
* 说明：
* 	编译时异常：Java程序必须显式进行异常处理，否则程序就会报错，编译无法通过；
* 	运行时异常：无需显式处理
* 	注意：运行时异常一般是由程序编写的不够严谨造成的，可通过修改代码来解决。
* @Author: 李超	lc_jack@foxmail.com
* @CreateDate: 2017-1-14 下午5:02:39 
* @Version: V1.0
 */
public class ExceptionDemo02 {
	
	/**
	* @Name: runtimeException
	* @Description: 运行时异常测试
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-14 下午5:07:44
	* @Parameters: 
	* @Return: void
	 */
	@Test
	public void runtimeException01() {
		int a = 10 ;
		int b = 0 ;
		System.out.println(a/b);
	}
	
	/**
	* @Name: runtimeException02
	* @Description: 修改代码逻辑，解决运行时异常问题
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-14 下午5:08:50
	* @Parameters: 
	* @Return: void
	 */
	@Test
	public void runtimeException02() {
		int a = 10 ;
		int b = 0 ;
		if(b != 0) {
			System.out.println(a/b);
		}
		System.out.println("over");
	}
	
	/**
	* @Name: compileException01
	* @Description: 编译时异常测试类一：抛给方法的调用者进行处理
	* 说明：
	* 	编译时异常可以由两种解决方法：
	* 		1、显式处理该异常；
	* 		2、抛给方法的调用者，由方法调用者进行处理，可以一直往上抛，最终抛给jvm进行处理；
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-14 下午5:11:16
	* @Parameters:  无
	* @Return: void 无
	 */
	@Test
	public void compileException01() throws ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ;
		String str = "2017-11-12" ;
		Date date = sdf.parse(str) ;
		System.out.println(date);
	}
	
	/**
	* @Name: compileException02
	* @Description: 编译时异常测试类二：对编译异常给出显示处理
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-14 下午5:11:16
	* @Parameters: 无
	* @Return: void 无
	 */
	@Test
	public void compileException02() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd") ;
		String str = "2017-11-12" ;
		Date date = null;
		try {
			date = sdf.parse(str);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		System.out.println(date);
	}
	
	/**
	* @Name: compileException02
	* @Description: 编译时异常测试类三：捕获并匹配到异常，并进行处理——打印Throwable对象的堆栈跟踪信息
	* 说明：
	* 	Throwable类常用方法：
	* 		public String getMessage()	获取异常信息，返回字符串。 
	* 		public String toString()	获取异常类名，和异常信息，返回字符串
	* 		public void printStackTrace()	获取异常类名和异常信息，以及异常出现在程序中的位置，返回值为void。
	* 		public void printStackTrace(PrintStream s) 将此 throwable 及其追踪输出到指定的输出流；通常用该方法将异常内容保存到日志中，以便排查。
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-14 下午5:11:16
	* @Parameters: 无
	* @Return: void 无
	 */
	@Test
	public void compileException03() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ;
		String str = "2017-11-12" ;
		Date date = null;
		try {
			//编译异常代码
			//说明：此处，jvm在进行编译时发现问题，此时，jvm将生成对应的异常对象并抛出，抛出后由catch进行捕获并匹配，如果匹配到该异常对象，或该异常对象的父类对象，则执行异常处理代码。
			date = sdf.parse(str);
		} catch (ParseException e) { //捕获并匹配到ParseException异常对象
			//异常处理：打印出Throwable对象的堆栈跟踪信息
//			System.out.println(e.getMessage()); //Unparseable date: "2017-11-12"
//			System.out.println(e.toString()); //java.text.ParseException: Unparseable date: "2017-11-12"
			//将异常信息输出到控制台
			e.printStackTrace() ;
			//或者
			//将异常信息保存到日志文件中
//			e.printStackTrace(PrintStream s) ;
			//跳转到指定页面（例如index.html，给出友情错误提示）
		}
		System.out.println("over");
	}
		
}
